package com.tangruojie.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * 配置类有 @ComponentScan，因此在容器初始化时：
 * 它不仅注册了 controller 包下的组件；
 * 它自己也会变成一个 Bean（@Configuration 本质就是一个特殊的 @Component）。
 */
@Configuration
@ComponentScan("com.tangruojie.controller")
@Import(SpringMvcSupport.class)
@EnableWebMvc
public class SpringMvcConfig {

    /**
     * 视图解析器：用于将控制器中返回的“逻辑视图名”转换成具体的“物理页面路径”。
     * 将控制器中返回的视图名（如 "books"）自动拼接为实际 JSP 文件路径（如 /WEB-INF/pages/books.jsp）并进行页面跳转。
     * ❗HTML 页面默认不会被视图解析器识别和解析！
     * 因为：
     * SpringMVC 默认视图解析器 InternalResourceViewResolver 支持的是 JSP，不支持 HTML 文件跳转。
     * 现在的 .html 页面无法作为视图返回，导致访问 /pages/books 时：
     * DispatcherServlet 收到逻辑视图名 books
     * 再加前缀 /WEB-INF/pages/ + 后缀 .jsp
     * 实际尝试访问路径：/WEB-INF/pages/books.jsp
     * ---------
     * 为什么 JSP 文件应该放在 /WEB-INF/pages/？
     * /WEB-INF 目录下的资源无法直接通过浏览器访问
     * 避免用户绕过 Controller 直接访问 JSP，增强安全性
     * 只能通过控制器跳转才能访问（比如 return "books"）
     * ---------
     * 什么请求会触发视图解析器？
     * 只有下面这种流程才会触发视图解析器：
     * 1、请求被 DispatcherServlet 接收；
     * 2、控制器方法返回的是 String 类型；
     * 3、没有标注 @ResponseBody；
     * 4、视图解析器将这个返回值当作 逻辑视图名；
     * 5、加上 prefix 和 suffix 拼接为完整页面路径；
     * 6、再进行页面跳转。
     * ✔ 只有在跳转页面时才会用到视图解析器。
     *
     * @return
     */
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}
